#include "countdown.h"

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>

Timer::Countdown::Countdown(QWidget *parent)
	:QWidget(parent)
{
	// 微调框的布局
	QHBoxLayout * timeLayout=new QHBoxLayout();
	initTimeSpinBox(); // 初始化微调框
	setConnect_TimeSpinBox(true); // 连接时间微调框与时间类
	timeLayout->addWidget(hourSpinBox);
	timeLayout->addWidget(minuteSpinBox);
	timeLayout->addWidget(secendSpinBox);

	// 提示/按钮布局
	QVBoxLayout * TipBtnLayout = new QVBoxLayout();
	start_end_btn = new QPushButton("开始");
	stop_btn = new QPushButton("暂停");
	stop_btn->setEnabled(false); // 没有开始倒计时，所以不能暂停
	tips = new QLabel("倒计时");
	tips->setFixedHeight(30); // 设置高度
	tips->setAlignment(Qt::AlignCenter); // 居中
	TipBtnLayout->addWidget(tips);
	TipBtnLayout->addWidget(start_end_btn);
	TipBtnLayout->addWidget(stop_btn);

	connect(start_end_btn, &QPushButton::clicked, this, &Timer::Countdown::start_end);
	connect(stop_btn, &QPushButton::clicked, this, &Timer::Countdown::stop_start);

	// 定时器
	qtimer = new QTimer(this);
	using namespace std::chrono_literals;
	qtimer->setInterval(1s); // 时间间隔
	qtimer->setTimerType(Qt::PreciseTimer);
	connect(qtimer, &QTimer::timeout, this, &Countdown::update_time_display);

	// 根布局
	QVBoxLayout * mainLayout = new QVBoxLayout();
	mainLayout->addLayout(timeLayout);
	mainLayout->addLayout(TipBtnLayout);

	this->setLayout(mainLayout);
}

void Timer::Countdown::initTimeSpinBox()
{
	hourSpinBox = new QSpinBox();
	minuteSpinBox = new QSpinBox();
	secendSpinBox = new QSpinBox();
	// 小时
	hourSpinBox->setValue(0);
	hourSpinBox->setRange(0, 99);
	hourSpinBox->setSingleStep(1);
	hourSpinBox->setWrapping(true);    // 设置循环
	hourSpinBox->setAccelerated(true); // 设置加速
	hourSpinBox->setSuffix("H"); // 设置后缀
	// 分钟
	minuteSpinBox->setValue(0);
	minuteSpinBox->setRange(0,60);
	minuteSpinBox->setSingleStep(1);
	minuteSpinBox->setWrapping(true);
	minuteSpinBox->setAccelerated(true);
	minuteSpinBox->setSuffix("M");
	// 秒钟
	secendSpinBox->setValue(0);
	secendSpinBox->setRange(0,60);
	secendSpinBox->setSingleStep(1);
	secendSpinBox->setWrapping(true);
	secendSpinBox->setAccelerated(true);
	secendSpinBox->setSuffix("S");
}

void Timer::Countdown::setReadOnly(bool b)
{
	hourSpinBox->setReadOnly(b);
	minuteSpinBox->setReadOnly(b);
	secendSpinBox->setReadOnly(b);
}

void Timer::Countdown::setConnect_TimeSpinBox(bool b)
{
	if(b){ // 连接时间微调框和时间设置的槽函数
		connect(hourSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_hours);
		connect(minuteSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_minutes);
		connect(secendSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_secends);
	}else{ // 断开时间微调框和时间设置函数之间的连接
		disconnect(hourSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_hours);
		disconnect(minuteSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_minutes);
		disconnect(secendSpinBox, &QSpinBox::valueChanged, this, &Countdown::set_secends);
	}
}

void Timer::Countdown::showTips()
{
	QMessageBox::information(NULL,"倒计时","本次计时已经结束，请完成下一个任务",QMessageBox::Ok);
}

void Timer::Countdown::show_timetips(){
	tips->setText(QString("共 %1小时 %2分钟 %3秒")
					.arg(record_time.get_hours())
					.arg(record_time.get_minutes())
					.arg(record_time.get_seconds()));
}

void Timer::Countdown::reset()
{
	timer = record_time;
	// 修改显示
	hourSpinBox->setValue(timer.get_hours());
	minuteSpinBox->setValue(timer.get_minutes());
	secendSpinBox->setValue(timer.get_seconds());
}

void Timer::Countdown::set_hours(int h)
{
#ifdef QT_DEBUG
	qDebug() << "倒计时::修改小时" ;
#endif
	timer.set_hours(h);
}

void Timer::Countdown::set_minutes(int m)
{
#ifdef QT_DEBUG
	qDebug() << "倒计时::修改分钟" ;
#endif
	timer.set_minutes(m);
}

void Timer::Countdown::set_secends(int s)
{
#ifdef QT_DEBUG
	qDebug() << "倒计时::修改秒钟" ;
#endif
	timer.set_secends(s);
}

void Timer::Countdown::start_end()
{
	if(run_status){ // 点击"结束"
		// 这里的逻辑要改成停止
		qtimer->stop(); // 停止定时器
		stop_btn->setEnabled(false);   // 没有倒计时，所以不能暂停
		reset();
		setConnect_TimeSpinBox(true);  // 连接信号槽，用于设置时间
		start_end_btn->setText("开始");
		setReadOnly(false); // 没有倒计时时可以修改
		run_status = false;
	}else if(timer.is_zero() == false){ // 点击"开始"
		record_time = timer; // 记录倒计时总时长
		show_timetips();     // 显示倒计时总时长
		qtimer->start();
		setConnect_TimeSpinBox(false); // 断开信号槽避免额外开销
		start_end_btn->setText("结束");
		setReadOnly(true);  // 倒计时时不能修改时间
		stop_btn->setEnabled(true); // 开始倒计时，可以暂停
		run_status = true;
		// 重置"暂停"状态
		stop_status = false;
		stop_btn->setText("暂停");
	}
}

void Timer::Countdown::stop_start()
{
	if(stop_status == false){ // 点击"暂停"
		stop_status = true;   // 进入暂停状态
		stop_btn->setText("恢复");
		qtimer->stop();
		// setConnect_TimeSpinBox(true);  // 连接信号槽，用于设置时间
	}else{ // 点击恢复
		stop_status = false; // 恢复倒计时
		qtimer->start();
		stop_btn->setText("暂停");
	}
}

void Timer::Countdown::update_time_display()
{
	timer.sub_one_second(); // 更新倒计时
	// 更新显示
	secendSpinBox->setValue(timer.get_seconds());
	minuteSpinBox->setValue(timer.get_minutes());
	hourSpinBox->setValue(timer.get_hours());
	// 判断是否结束
	if(timer.is_zero()){
		start_end(); // 停止倒计时
		emit(EndofCountdown()); // 发送倒计时结束信号
		showTips();   // 显示提示框
	}
}
